package com.hzit.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.hzit.entity.Student;
import com.hzit.mapper.StudentMapper;
import com.hzit.service.IStudentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author hbxfwf
 * @since 2024-02-23
 */
@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {

	@Resource
	private RedisTemplate redisTemplate;
	@Resource
	private StringRedisTemplate stringRedisTemplate;
	//1. 从redis中查询学生列表 （使用RedisTemplate）
	@Override
	public List<Student> list2() {
		//1.1 从reids中得到学生列表
		List<Student> studentList = (List<Student>) redisTemplate.opsForValue().get("studentList");
		//1.2 如果上面的集合没有，证明redis中没有此数据
		if(studentList == null){
			System.out.println("从数据库中查询数据。。。");
			studentList = this.list();
			//1.2.1 再存放到redis中
			redisTemplate.opsForValue().set("studentList",studentList);
		}
		return studentList;
	}

	//2. 从redis中查询学生列表 （使用StringRedisTemplate）
	@Override
	public List<Student> list3() {
		//2.1 从redis中加载学生列表
		String students = stringRedisTemplate.opsForValue().get("studentList2");
		//2.2 将字符转换
		List<Student> studentList = null;
		if(StrUtil.isNotBlank(students)) {
			studentList = JSON.parseArray(students, Student.class);
		}else{
			System.out.println("正在从数据库中取得数据。。。");
			studentList = this.list();
			// 将其放到redis中
			stringRedisTemplate.opsForValue().set("studentList2",JSON.toJSONString(studentList));
		}
		return studentList;
	}

	//3. 添加学生时清空缓存
	@Override
	public void insert(Student student) {
		//3.1 清空缓存
		stringRedisTemplate.delete("studentList2");
		//3.2 插入数据到数据库中
		this.save(student);
	}
	//4. 修改学生时清空缓存
	@Override
	public void update(Student student) {
		//4.1 清空缓存
		stringRedisTemplate.delete("studentList2");
		//4.2 修改数据到数据库中
		this.updateById(student);
	}

	//5. 删除学生时清空缓存
	@Override
	public void delete(Long sid) {
		stringRedisTemplate.delete("studentList2");
		this.removeById(sid);
	}
}
